package com.whcoding.test.common;

import org.hibernate.type.DateType;

import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @program: spring-boot-learning
 * @description:
 * @author: whcoding
 * @create: 2022-04-21 11:24
 **/
public class DateTime8Util {

	public static final DateTimeFormatter DFY_MD_HMS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	public static final DateTimeFormatter DFY_MD = DateTimeFormatter.ofPattern("yyyy-MM-dd");

	/**
	 * LocalDateTime 转时间戳
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static Long getTimeStamp(LocalDateTime localDateTime) {
		return localDateTime.atZone(ZoneId.systemDefault()).toEpochSecond();
	}

	/**
	 * 时间戳转LocalDateTime
	 *
	 * @param timeStamp /
	 * @return /
	 */
	public static LocalDateTime fromTimeStamp(Long timeStamp) {
		return LocalDateTime.ofEpochSecond(timeStamp, 0, OffsetDateTime.now().getOffset());
	}

	/**
	 * LocalDateTime 转 Date
	 * Jdk8 后 不推荐使用 {@link Date} Date
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static Date toDate(LocalDateTime localDateTime) {
		return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
	}

	/**
	 * LocalDate 转 Date
	 * Jdk8 后 不推荐使用 {@link Date} Date
	 *
	 * @param localDate /
	 * @return /
	 */
	public static Date toDate(LocalDate localDate) {
		return toDate(localDate.atTime(LocalTime.now(ZoneId.systemDefault())));
	}


	/**
	 * Date转 LocalDateTime
	 * Jdk8 后 不推荐使用 {@link Date} Date
	 *
	 * @param date /
	 * @return /
	 */
	public static LocalDateTime toLocalDateTime(Date date) {
		return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
	}

	/**
	 * 日期 格式化
	 *
	 * @param localDateTime /
	 * @param patten        /
	 * @return /
	 */
	public static String localDateTimeFormat(LocalDateTime localDateTime, String patten) {
		DateTimeFormatter df = DateTimeFormatter.ofPattern(patten);
		return df.format(localDateTime);
	}

	/**
	 * 日期 格式化
	 *
	 * @param localDateTime /
	 * @param df            /
	 * @return /
	 */
	public static String localDateTimeFormat(LocalDateTime localDateTime, DateTimeFormatter df) {
		return df.format(localDateTime);
	}

	/**
	 * 日期格式化 yyyy-MM-dd HH:mm:ss
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static String localDateTimeFormatyMdHms(LocalDateTime localDateTime) {
		return DFY_MD_HMS.format(localDateTime);
	}

	/**
	 * 日期格式化 yyyy-MM-dd
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static String localDateTimeFormatyMd(LocalDateTime localDateTime) {
		return DFY_MD.format(localDateTime);
	}

	/**
	 * 字符串转 LocalDateTime ，字符串格式 yyyy-MM-dd
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static LocalDateTime parseLocalDateTimeFormat(String localDateTime, String pattern) {
		DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
		return LocalDateTime.from(dateTimeFormatter.parse(localDateTime));
	}

	/**
	 * 字符串转 LocalDateTime ，字符串格式 yyyy-MM-dd
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static LocalDateTime parseLocalDateTimeFormat(String localDateTime, DateTimeFormatter dateTimeFormatter) {
		return LocalDateTime.from(dateTimeFormatter.parse(localDateTime));
	}

	/**
	 * 字符串转 LocalDateTime ，字符串格式 yyyy-MM-dd HH:mm:ss
	 *
	 * @param localDateTime /
	 * @return /
	 */
	public static LocalDateTime parseLocalDateTimeFormatyMdHms(String localDateTime) {
		return LocalDateTime.from(DFY_MD_HMS.parse(localDateTime));
	}

}
